package com.dongliusuo.orangeforms.webadmin.app.service.impl;

import com.dongliusuo.orangeforms.common.sequence.wrapper.IdGeneratorWrapper;
import com.dongliusuo.orangeforms.common.core.base.service.BaseDictService;
import com.dongliusuo.orangeforms.common.core.base.dao.BaseDaoMapper;
import com.dongliusuo.orangeforms.common.redis.cache.RedisTreeDictionaryCache;
import com.dongliusuo.orangeforms.webadmin.app.service.AreaCodeService;
import com.dongliusuo.orangeforms.webadmin.app.dao.AreaCodeMapper;
import com.dongliusuo.orangeforms.webadmin.app.model.AreaCode;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import jakarta.annotation.PostConstruct;

/**
 * 国内行政区划字典数据操作服务类。
 *
 * @author DongLiusuo
 * @date 2025-01-08
 */
@Slf4j
@Service("areaCodeService")
public class AreaCodeServiceImpl extends BaseDictService<AreaCode, String> implements AreaCodeService {

    @Autowired
    private AreaCodeMapper areaCodeMapper;
    @Autowired
    private IdGeneratorWrapper idGenerator;
    @Autowired
    private RedissonClient redissonClient;

    public AreaCodeServiceImpl() {
        super();
    }

    @PostConstruct
    public void init() {
        this.dictionaryCache = RedisTreeDictionaryCache.create(
                redissonClient,
                "AreaCode",
                AreaCode.class,
                AreaCode::getAreaId,
                AreaCode::getParentId);
    }

    /**
     * 返回当前Service的主表Mapper对象。
     *
     * @return 主表Mapper对象。
     */
    @Override
    protected BaseDaoMapper<AreaCode> mapper() {
        return areaCodeMapper;
    }

    /**
     * 保存新增对象。
     *
     * @param areaCode 新增对象。
     * @return 返回新增对象。
     */
    @Override
    public AreaCode saveNew(AreaCode areaCode) {
        areaCode.setAreaId(idGenerator.nextStringId());
        return super.saveNew(areaCode);
    }

    /**
     * 判断指定对象是否包含下级对象。
     *
     * @param areaId 主键Id。
     * @return 存在返回true，否则false。
     */
    @Override
    public boolean hasChildren(String areaId) {
        AreaCode filter = new AreaCode();
        filter.setParentId(areaId);
        return getCountByFilter(filter) > 0;
    }
}
